<?php
/**
 * 用户信息类.
 * @author 高文杰 <gaowenjie_xy@126.com>
 */

class UserModel extends Model
{
    /** @type string 表名 */
    protected $tableName = 'user1';  

    /** @type string 超级管理员 */
    const ADMIN_USER = 'ADMIN-USER';
    /** @type string 管理员 */
    const MANAGER_USER = 'MANAGER-USER';
    /** @type string 读 */
    const USER_READ = 'USER-READ';
    /** @type string 写 */
    const USER_INSERT = 'USER-INSERT';
    /** @type string 修改 */
    const USER_UPDATE = 'USER-UPDATE';
    /** @type string 删除 */
    const USER_DELETE = 'USER-DELETE';
    /** @type string 评论/回复 */
    const USER_REPLY = 'USER-REPLY';

    /** @type tinyint 未锁定 */
    const USER_TYPE_IS_LOCK = 1;
    /** @type tinyint  锁定*/
    const USER_TYPE_LOCK = 0;


    // 用户不存在
    const ERROR_USER_EMPTY = -1;
    // 邮箱为空
    const ERROR_USER_EMIAL_EMPTY = -10;

    /**
     * 验证密码
     * @param string $password 旧密码.
     * @return boolean
     */
    public static function checkPassword($password)
    {
        if (empty($password))
        {
            return false;
        }

        //获取密码
        $user = M("user")->field("u_id")->where("u_psw = '" . md5($password) . "' and u_id = '". session('u_id') . "'")->limit(1)->find();

        if ($user)
        {
            return true;
        }

        return false;
    }

    /**
     * 修改密码
     * @param string $newPassword 新密码.
     * @return bool.
     */
    public static function updatePassword($newPassword)
    {
        if (empty($newPassword))
        {
            return false;
        }

        //修改密码.
        $date = array(
            'u_id' => session('u_id'),
            'u_psw' => md5($newPassword),
            );

        $user = M("user")->save($date);

        if ($user)
        {
             return true;
        }

        return false;
    }

    /**
     * 获取当前用户信息
     * @param    int   $userId     用户ID
     * @return   array()
     */
    public static function getUserInfo()
    {
        $result = array();

        $id = session('u_id');

        //获取用户信息SQL.
        $user = M("user")->where("u_id = " . $id)->find();

        if ($user)
        {
            return $user;
        }

        return array();
    }

    /**
     * 获取用户信息是否存在
     * @param   int       $id    用户ID
     * @return  boolean
     */
    public static function isHasUser($id)
    {
        if (empty($id)) {
            return false;
        }

        $hasUser = M("user")->where("u_id = " . $id)->find();

        if ($hasUser)
        {
            return true;
        }

        return false;
    }

    /**
     * 用户加锁和解锁
     * @param    int       $id        用户ID
     * @param    int       $status    操作用户的状态
     * @return   boolean
     */
    public static function isLock($id, $status)
    {

        if (empty($id))
        {
             return false;
        }

        $data = array(
            'u_id' => $id,
            'status' => $status,
            );

        $user = M("user")->save($data);

        if ($user)
        {
            return true;
        }

        return false;
    }

    /**
     * 检测用户名是否已经存在
     *
     * @param  string    $userName    用户名
     * @return boolean
     */
    public static function checkUser($userName)
    {
        $user = M("user")->field("u_id")->where("u_name = '" . $userName . "'")->find();

        if ($user)
        {
            return true;
        }

        return false;
    }


    /**
     * 用户注册
     * @param   string   $userName   用户名
     * @param   string   $password   用户密码
     * @return  boolean
     */
    public static function register($userName, $password, $email)
    {
        if (empty($password) || empty($userName) || empty($email))
        {
            return false;
        }

        $data = array(
            'u_name' => $userName,
            'u_psw' => md5($password),
            'status' => self::USER_TYPE_IS_LOCK,
            'u_type' => commonModel::$isOrdinatyType,
            'u_mail' => $email,
            );
        $aUser = M('user')->add($data);

        if ($aUser > 0)
        {
            return $aUser;
        }

        return 0;
    }

    /**
     * 验证邮箱
     *
     * @param   int      $uId      用户ID
     * @param   string   $email    邮箱
     * @return  int
     */
    public static function checkEmail($uId, $auth)
    {
        if (empty($uId)) {
            return self::ERROR_USER_EMPTY;
        }

        if (empty($auth)) {
            return self::ERROR_USER_EMIAL_EMPTY;
        }

        $iUser = M("user")->field("u_mail")->where("u_id=" . $uId)->find();
        if (empty($iUser)) {
            return self::ERROR_USER_EMPTY;
        }

        $aMate = array(
                'u_id' => $uId,
                'u_email' => $iUser['u_mail'],
                'u_auth_email' => $auth,
            );
        $r = M("user")->save($aMate);

        if ($r < 0) {
            return $r;
        }

        return 0;
    }

    /**
     * 用户角色
     *
     * @param  string|array  $roles  用户角色
     * @return boolean
     */
    public static function hasRules($roles)
    {
        // 权限验证为空
        if (empty($roles)) {
            return false;
        }

        $userId = session('u_id');
        $user = M('user')->field('`group_id`')->where('`u_id`=' . $userId . ' and `status`=' . self::USER_TYPE_IS_LOCK)->find();

        if (empty($user)) {
            return false;
        }

        // 获取角色类型
        $hasRoles = M('group')->field('`rule`')->where('is_lock=' . GroupModel::UNLOCK_GROUP . ' and id=' . $user['group_id'] )->find();

        // 如果参数是字符串并且含有英文 ',',转为数组。

        if (is_string($roles)) {
            $roles = explode(',', $roles);
        }

        // 超级管理权限直接返回TURE.
        if (strpos($hasRoles['rule'], UserModel::ADMIN_USER) !== false) {
            return true;
        }

        // 验证角色是否存在
        foreach ($roles as $role) {
            if (strpos($hasRoles['rule'], $role) !== false) {
                continue;
            } else {
                return false;
            }
        }

        return true;
    }

    /**
     * 用户权限
     *
     * @param  string|array   $checkRoles   验证权限
     * @return boolean
     */
    public static function isRoles($checkRoles)
    {
        if (empty($checkRoles)) {
            return false;
        }

        $userId = session('u_id');
        $user = M('user')->field('`group_id`')->where('`u_id`=' . $userId . ' and `status`=' . self::USER_TYPE_IS_LOCK)->find();

        if (empty($user)) {
            return false;
        }

        $hasRoles = M('group')->field('`rule`')->where('is_lock=' . GroupModel::UNLOCK_GROUP . ' and id=' . $user['group_id'] )->find();

        // 如果参数是字符串并且含有英文 ',',转为数组。
        if (is_string($checkRoles)) {
            $checkRoles = explode(',', $checkRoles);
        }

        foreach($checkRoles as $role) {
            if (strpos($hasRoles['rule'], $role) === false) {
                return false;
            }
        }

        return true;
    }
}
?>